ä¿å®æ§ãæ¡åŒµæ§ããã¹ãæ§ã«åªããããã³ããšã³ãã¢ããªãæ§ç¯ããããã®ãããµãŽãã«ïŒã¯ãªãŒã³ã¢ãŒããã¯ãã£ãæ¢æ±ããã®ååãå©ç¹ãå®è·µçãªå®è£ æŠç¥ã解説ããŸãã
ããã³ããšã³ãã¢ãŒããã¯ãã£ïŒã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ãªãŒã³ã¢ãŒããã¯ãã£
ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãè€éåããã«ã€ããŠãä¿å®æ§ããã¹ãæ§ãæ¡åŒµæ§ã®ããã«ã¯ãæç¢ºã«å®çŸ©ãããã¢ãŒããã¯ãã£ãäžå¯æ¬ ã«ãªããŸãããããã®æžå¿µã«å¯ŸåŠãã2ã€ã®äººæ°ã®ããã¢ãŒããã¯ãã£ãã¿ãŒã³ãããããµãŽãã«ã¢ãŒããã¯ãã£ïŒããŒãïŒã¢ããã¿ãŒãšããŠãç¥ãããïŒãšã¯ãªãŒã³ã¢ãŒããã¯ãã£ã§ãããããã¯ããšããšããã¯ãšã³ãã®äžçã§çãŸããŸãããããã®ååã¯ããã³ããšã³ãéçºã«ã广çã«é©çšã§ããå ç¢ã§é©å¿æ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæã§ããŸãã
ããã³ããšã³ãã¢ãŒããã¯ãã£ãšã¯ïŒ
ããã³ããšã³ãã¢ãŒããã¯ãã£ã¯ãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³å ã®ããŸããŸãªã³ã³ããŒãã³ãã®æ§é ãçµç¹ãããã³çžäºäœçšãå®çŸ©ããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«æ§ç¯ãããä¿å®ãããæ¡åŒµããããã®éåçãæäŸããŸããåªããããã³ããšã³ãã¢ãŒããã¯ãã£ã¯ã以äžãä¿é²ããŸãïŒ
- ä¿å®æ§ïŒ ã³ãŒãã®çè§£ãä¿®æ£ããããã°ã容æã«ãªããŸãã
- ãã¹ãæ§ïŒ ãŠããããã¹ããçµåãã¹ãã®äœæã容æã«ããŸãã
- æ¡åŒµæ§ïŒ ã¢ããªã±ãŒã·ã§ã³ãå¢å€§ããè€éãããŠãŒã¶ãŒè² è·ã«å¯Ÿå¿ã§ããããã«ãªããŸãã
- åå©çšæ§ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåã§ã³ãŒãã®åå©çšãä¿é²ããŸãã
- æè»æ§ïŒ å€åããèŠä»¶ãæ°ãããã¯ãããžãŒã«é©å¿ããŸãã
æç¢ºãªã¢ãŒããã¯ãã£ããªããšãããã³ããšã³ããããžã§ã¯ãã¯ããã«ã¢ããªã·ãã¯ã§ç®¡çãå°é£ã«ãªããéçºã³ã¹ãã®å¢å ãšä¿ææ§ã®äœäžã«ã€ãªããå¯èœæ§ããããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£å ¥é
Alistair Cockburnã«ãã£ãŠæå±ããããããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ããžãã¹ããžãã¯ããããŒã¿ããŒã¹ãUIãã¬ãŒã ã¯ãŒã¯ããµãŒãããŒãã£APIãªã©ã®å€éšäŸåããåãé¢ãããšãç®çãšããŠããŸããããã¯ããŒãïŒã¢ããã¿ãŒãšããæŠå¿µãéããŠå®çŸãããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®äž»èŠæŠå¿µïŒ
- ã³ã¢ïŒãã¡ã€ã³ïŒïŒ ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãšãŠãŒã¹ã±ãŒã¹ãå«ã¿ãŸããå€éšã®ãã¬ãŒã ã¯ãŒã¯ããã¯ãããžãŒããç¬ç«ããŠããŸãã
- ããŒãïŒ ã³ã¢ãå€éšã®äžçãšã©ã®ããã«çžäºäœçšããããå®çŸ©ããã€ã³ã¿ãŒãã§ãŒã¹ã§ããã³ã¢ã®å ¥åãšåºåã®å¢çã衚ããŸãã
- ã¢ããã¿ãŒïŒ ã³ã¢ãç¹å®ã®å€éšã·ã¹ãã ã«æ¥ç¶ããããŒãã®å®è£ ã§ããã¢ããã¿ãŒã«ã¯2ã€ã®ã¿ã€ãããããŸãïŒ
- ãã©ã€ãã³ã°ã¢ããã¿ãŒïŒãã©ã€ããªã¢ããã¿ãŒïŒïŒ ã³ã¢ãšã®çžäºäœçšãéå§ããŸããäŸãšããŠãUIã³ã³ããŒãã³ããã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ããŸãã¯ä»ã®ã¢ããªã±ãŒã·ã§ã³ãæããããŸãã
- ããªãã³ã¢ããã¿ãŒïŒã»ã«ã³ããªã¢ããã¿ãŒïŒïŒ ã³ã¢ã«ãã£ãŠåŒã³åºãããå€éšã·ã¹ãã ãšçžäºäœçšããŸããäŸãšããŠãããŒã¿ããŒã¹ãAPIããŸãã¯ãã¡ã€ã«ã·ã¹ãã ãæããããŸãã
ã³ã¢ã¯ç¹å®ã®ã¢ããã¿ãŒã«ã€ããŠäœãç¥ããŸãããããŒããä»ããŠã®ã¿ããããšçžäºäœçšããŸãããã®åé¢ã«ãããã³ã¢ããžãã¯ã«åœ±é¿ãäžããããšãªããããŸããŸãªã¢ããã¿ãŒãç°¡åã«äº€æã§ããŸããäŸãã°ããã©ã€ãã³ã°ã¢ããã¿ãŒã眮ãæããã ãã§ãããUIãã¬ãŒã ã¯ãŒã¯ïŒäŸïŒReactïŒããå¥ã®ãã®ïŒäŸïŒVue.jsïŒã«åãæ¿ããããšãã§ããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®å©ç¹ïŒ
- ãã¹ãæ§ã®åäžïŒ ã³ã¢ããžãã¹ããžãã¯ã¯ãå€éšã®äŸåé¢ä¿ã«é Œãããšãªããç¬ç«ããŠç°¡åã«ãã¹ãã§ããŸããã¢ãã¯ã¢ããã¿ãŒã䜿çšããŠå€éšã·ã¹ãã ã®åäœãã·ãã¥ã¬ãŒãã§ããŸãã
- ä¿å®æ§ã®åäžïŒ å€éšã·ã¹ãã ã®å€æŽãã³ã¢ããžãã¯ã«äžãã圱é¿ã¯æå°éã§ããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®é·æçãªä¿å®ãšé²åã容æã«ãªããŸãã
- æè»æ§ã®åäžïŒ ã¢ããã¿ãŒã远å ãŸãã¯äº€æããããšã§ãã¢ããªã±ãŒã·ã§ã³ãæ°ãããã¯ãããžãŒãèŠä»¶ã«ç°¡åã«é©å¿ãããããšãã§ããŸãã
- åå©çšæ§ã®åŒ·åïŒ ã³ã¢ããžãã¹ããžãã¯ã¯ãç°ãªãã¢ããã¿ãŒã«æ¥ç¶ããããšã§ãããŸããŸãªã³ã³ããã¹ãã§åå©çšã§ããŸãã
ã¯ãªãŒã³ã¢ãŒããã¯ãã£å ¥é
Robert C. MartinïŒã¢ã³ã¯ã«ã»ããïŒã«ãã£ãŠåºããããã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯ãé¢å¿ã®åé¢ãšççµåãéèŠããããäžã€ã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ããããã¯ããã¬ãŒã ã¯ãŒã¯ãããŒã¿ããŒã¹ãUIãããã³ããããå€éšæ©é¢ããç¬ç«ããã·ã¹ãã ãäœæããããšã«çŠç¹ãåœãŠãŠããŸãã
ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®äž»èŠæŠå¿µïŒ
ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯ãã¢ããªã±ãŒã·ã§ã³ãåå¿åç¶ã®ã¬ã€ã€ãŒã«æŽçããŸããäžå¿ã«ã¯æãæœè±¡çã§åå©çšå¯èœãªã³ãŒãããå€åŽã®ã¬ã€ã€ãŒã«ã¯æãå ·äœçã§ãã¯ãããžãŒã«äŸåããã³ãŒããé 眮ããŸãã
- ãšã³ãã£ãã£ïŒ ã¢ããªã±ãŒã·ã§ã³ã®äžæ žãšãªãããžãã¹ãªããžã§ã¯ããšã«ãŒã«ã衚ããŸãããããã¯ã©ã®å€éšã·ã¹ãã ãããç¬ç«ããŠããŸãã
- ãŠãŒã¹ã±ãŒã¹ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãšããŠãŒã¶ãŒãã·ã¹ãã ãšã©ã®ããã«å¯Ÿè©±ããããå®çŸ©ããŸããç¹å®ã®ã¿ã¹ã¯ãå®è¡ããããã«ãšã³ãã£ãã£ãç·šæããŸãã
- ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒïŒ ãŠãŒã¹ã±ãŒã¹ãšå€éšã·ã¹ãã ãšã®éã§ããŒã¿ã倿ããŸãããã®ã¬ã€ã€ãŒã«ã¯ããã¬ãŒã³ã¿ãŒãã³ã³ãããŒã©ãŒãã²ãŒããŠã§ã€ãå«ãŸããŸãã
- ãã¬ãŒã ã¯ãŒã¯ãšãã©ã€ããŒïŒ UIãã¬ãŒã ã¯ãŒã¯ãããŒã¿ããŒã¹ããã®ä»ã®å€éšãã¯ãããžãŒãå«ãæå€å±€ã®ã¬ã€ã€ãŒã§ãã
ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®äŸåæ§ã®ã«ãŒã«ã¯ãå€åŽã®ã¬ã€ã€ãŒã¯å åŽã®ã¬ã€ã€ãŒã«äŸåã§ããããå åŽã®ã¬ã€ã€ãŒã¯å€åŽã®ã¬ã€ã€ãŒã«äŸåã§ããªãããšå®ããŠããŸããããã«ãããã³ã¢ããžãã¹ããžãã¯ãå€éšã®ãã¬ãŒã ã¯ãŒã¯ããã¯ãããžãŒããç¬ç«ããŠããããšãä¿èšŒãããŸãã
ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®å©ç¹ïŒ
- ãã¬ãŒã ã¯ãŒã¯ããã®ç¬ç«ïŒ ãã®ã¢ãŒããã¯ãã£ã¯ãæ©èœè±å¯ãªãœãããŠã§ã¢ã©ã€ãã©ãªã®ååšã«äŸåããŸãããããã«ãããã·ã¹ãã ããã¬ãŒã ã¯ãŒã¯ã®éå®ãããå¶çŽã«æŒã蟌ãã®ã§ã¯ãªãããã¬ãŒã ã¯ãŒã¯ãããŒã«ãšããŠäœ¿çšã§ããŸãã
- ãã¹ãå¯èœïŒ ããžãã¹ã«ãŒã«ã¯ãUIãããŒã¿ããŒã¹ãWebãµãŒããŒããã®ä»ã®å€éšèŠçŽ ãªãã§ãã¹ãã§ããŸãã
- UIããã®ç¬ç«ïŒ ã·ã¹ãã ã®ä»ã®éšåã倿ŽããããšãªããUIãç°¡åã«å€æŽã§ããŸããWeb UIã¯ãããžãã¹ã«ãŒã«ã倿Žããããšãªããã³ã³ãœãŒã«UIã«çœ®ãæããããšãã§ããŸãã
- ããŒã¿ããŒã¹ããã®ç¬ç«ïŒ OracleãSQL ServerããMongoãBigTableãCouchDBãªã©ã«äº€æã§ããŸããããžãã¹ã«ãŒã«ã¯ããŒã¿ããŒã¹ã«çžãããŸããã
- ããããå€éšæ©é¢ããã®ç¬ç«ïŒ å®éãããžãã¹ã«ãŒã«ã¯å€éšã®äžçã«ã€ããŠ*äœã*ç¥ããŸããã
ããã³ããšã³ãéçºãžã®ãããµãŽãã«ããã³ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®é©çš
ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯ããã¯ãšã³ãéçºã«é¢é£ä»ããããããšãå€ãã§ããããã®ååã¯ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãšä¿å®æ§ãåäžãããããã«å¹æçã«é©çšã§ããŸãããã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
1. ã³ã¢ïŒãã¡ã€ã³ïŒãç¹å®ãã
æåã®ã¹ãããã¯ãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ããžãã¹ããžãã¯ãç¹å®ããããšã§ããããã«ã¯ãUIãã¬ãŒã ã¯ãŒã¯ãå€éšAPIããç¬ç«ãããšã³ãã£ãã£ããŠãŒã¹ã±ãŒã¹ãããžãã¹ã«ãŒã«ãå«ãŸããŸããäŸãã°ãeã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã¢ã«ã¯ååãã·ã§ããã³ã°ã«ãŒããæ³šæã管çããããžãã¯ãå«ãŸãããããããŸããã
äŸïŒ ã¿ã¹ã¯ç®¡çã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã¢ãã¡ã€ã³ã¯ä»¥äžã§æ§æãããŸãïŒ
- ãšã³ãã£ãã£ïŒ ã¿ã¹ã¯ããããžã§ã¯ãããŠãŒã¶ãŒ
- ãŠãŒã¹ã±ãŒã¹ïŒ CreateTask, UpdateTask, AssignTask, CompleteTask, ListTasks
- ããžãã¹ã«ãŒã«ïŒ ã¿ã¹ã¯ã«ã¯ã¿ã€ãã«ãå¿ èŠããããžã§ã¯ãã®ã¡ã³ããŒã§ã¯ãªããŠãŒã¶ãŒã«ã¿ã¹ã¯ãå²ãåœãŠãããšã¯ã§ããªãã
2. ããŒããšã¢ããã¿ãŒïŒãããµãŽãã«ã¢ãŒããã¯ãã£ïŒãŸãã¯ã¬ã€ã€ãŒïŒã¯ãªãŒã³ã¢ãŒããã¯ãã£ïŒãå®çŸ©ãã
次ã«ãã³ã¢ãå€éšã·ã¹ãã ããåé¢ããããŒããšã¢ããã¿ãŒïŒãããµãŽãã«ã¢ãŒããã¯ãã£ïŒãŸãã¯ã¬ã€ã€ãŒïŒã¯ãªãŒã³ã¢ãŒããã¯ãã£ïŒãå®çŸ©ããŸããããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã«ã¯ä»¥äžãå«ãŸããå ŽåããããŸãïŒ
- UIã³ã³ããŒãã³ãïŒãã©ã€ãã³ã°ã¢ããã¿ãŒ/ãã¬ãŒã ã¯ãŒã¯ïŒãã©ã€ããŒïŒïŒ ãŠãŒã¶ãŒãšå¯Ÿè©±ããReactãVue.jsãAngularã³ã³ããŒãã³ãã
- APIã¯ã©ã€ã¢ã³ãïŒããªãã³ã¢ããã¿ãŒ/ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒïŒïŒ ããã¯ãšã³ãAPIã«ãªã¯ãšã¹ããè¡ããµãŒãã¹ã
- ããŒã¿ã¹ãã¢ïŒããªãã³ã¢ããã¿ãŒ/ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒïŒïŒ ããŒã«ã«ã¹ãã¬ãŒãžãIndexedDBããŸãã¯ãã®ä»ã®ããŒã¿ã¹ãã¬ãŒãžã¡ã«ããºã ã
- ç¶æ 管çïŒã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒïŒïŒ ReduxãVuexããŸãã¯ãã®ä»ã®ç¶æ 管çã©ã€ãã©ãªã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã䜿çšããäŸïŒ
- ã³ã¢ïŒ ã¿ã¹ã¯ç®¡çããžãã¯ïŒãšã³ãã£ãã£ããŠãŒã¹ã±ãŒã¹ãããžãã¹ã«ãŒã«ïŒã
- ããŒãïŒ
TaskServiceïŒã¿ã¹ã¯ã®äœæãæŽæ°ãååŸã®ããã®ã¡ãœãããå®çŸ©ïŒã - ãã©ã€ãã³ã°ã¢ããã¿ãŒïŒ
TaskServiceã䜿çšããŠã³ã¢ãšå¯Ÿè©±ããReactã³ã³ããŒãã³ãã - ããªãã³ã¢ããã¿ãŒïŒ
TaskServiceãå®è£ ããããã¯ãšã³ãAPIã«ãªã¯ãšã¹ããè¡ãAPIã¯ã©ã€ã¢ã³ãã
ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã䜿çšããäŸïŒ
- ãšã³ãã£ãã£ïŒ Task, Project, UserïŒçŽç²ãªJavaScriptãªããžã§ã¯ãïŒã
- ãŠãŒã¹ã±ãŒã¹ïŒ CreateTaskUseCase, UpdateTaskUseCaseïŒãšã³ãã£ãã£ãç·šæïŒã
- ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒïŒ
- ã³ã³ãããŒã©ãŒïŒUIããã®ãŠãŒã¶ãŒå ¥åãåŠçã
- ãã¬ãŒã³ã¿ãŒïŒUIã§è¡šç€ºããããã«ããŒã¿ããã©ãŒãããã
- ã²ãŒããŠã§ã€ïŒAPIã¯ã©ã€ã¢ã³ããšå¯Ÿè©±ã
- ãã¬ãŒã ã¯ãŒã¯ãšãã©ã€ããŒïŒ Reactã³ã³ããŒãã³ããAPIã¯ã©ã€ã¢ã³ãïŒaxios, fetchïŒã
3. ã¢ããã¿ãŒïŒãããµãŽãã«ã¢ãŒããã¯ãã£ïŒãŸãã¯ã¬ã€ã€ãŒïŒã¯ãªãŒã³ã¢ãŒããã¯ãã£ïŒãå®è£ ãã
次ã«ãã³ã¢ãå€éšã·ã¹ãã ã«æ¥ç¶ããã¢ããã¿ãŒãŸãã¯ã¬ã€ã€ãŒãå®è£ ããŸããã¢ããã¿ãŒãŸãã¯ã¬ã€ã€ãŒãã³ã¢ããç¬ç«ããŠãããã³ã¢ãããŒããŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠã®ã¿ããããšå¯Ÿè©±ããããšã確èªããŠãã ãããããã«ãããã³ã¢ããžãã¯ã«åœ±é¿ãäžããããšãªããç°ãªãã¢ããã¿ãŒãŸãã¯ã¬ã€ã€ãŒãç°¡åã«äº€æã§ããŸãã
äŸïŒãããµãŽãã«ã¢ãŒããã¯ãã£ïŒïŒ
// TaskService ããŒã
interface TaskService {
createTask(taskData: TaskData): Promise;
updateTask(taskId: string, taskData: TaskData): Promise;
getTask(taskId: string): Promise;
}
// APIã¯ã©ã€ã¢ã³ãã¢ããã¿ãŒ
class ApiTaskService implements TaskService {
async createTask(taskData: TaskData): Promise {
// ã¿ã¹ã¯ãäœæããããã®APIãªã¯ãšã¹ããè¡ã
}
async updateTask(taskId: string, taskData: TaskData): Promise {
// ã¿ã¹ã¯ãæŽæ°ããããã®APIãªã¯ãšã¹ããè¡ã
}
async getTask(taskId: string): Promise {
// ã¿ã¹ã¯ãååŸããããã®APIãªã¯ãšã¹ããè¡ã
}
}
// Reactã³ã³ããŒãã³ãã¢ããã¿ãŒ
function TaskList() {
const taskService: TaskService = new ApiTaskService();
const handleCreateTask = async (taskData: TaskData) => {
await taskService.createTask(taskData);
// ã¿ã¹ã¯ãªã¹ããæŽæ°
};
// ...
}
äŸïŒã¯ãªãŒã³ã¢ãŒããã¯ãã£ïŒïŒ
// ãšã³ãã£ãã£
class Task {
constructor(public id: string, public title: string, public description: string) {}
}
// ãŠãŒã¹ã±ãŒã¹
class CreateTaskUseCase {
constructor(private taskGateway: TaskGateway) {}
async execute(title: string, description: string): Promise {
const task = new Task(generateId(), title, description);
await this.taskGateway.create(task);
return task;
}
}
// ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒ - ã²ãŒããŠã§ã€
interface TaskGateway {
create(task: Task): Promise;
}
class ApiTaskGateway implements TaskGateway {
async create(task: Task): Promise {
// ã¿ã¹ã¯äœæã®ããã®APIãªã¯ãšã¹ããè¡ã
}
}
// ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒ - ã³ã³ãããŒã©ãŒ
class TaskController {
constructor(private createTaskUseCase: CreateTaskUseCase) {}
async createTask(req: Request, res: Response) {
const { title, description } = req.body;
const task = await this.createTaskUseCase.execute(title, description);
res.json(task);
}
}
// ãã¬ãŒã ã¯ãŒã¯ïŒãã©ã€ã㌠- Reactã³ã³ããŒãã³ã
function TaskForm() {
const [title, setTitle] = useState('');
const [description, setDescription] = useState('');
const apiTaskGateway = new ApiTaskGateway();
const createTaskUseCase = new CreateTaskUseCase(apiTaskGateway);
const taskController = new TaskController(createTaskUseCase);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
await taskController.createTask({ body: { title, description } } as Request, { json: (data: any) => console.log(data) } as Response);
};
return (
);
}
4. äŸåæ§ã®æ³šå ¥ãå®è£ ãã
ã³ã¢ãå€éšã·ã¹ãã ããããã«åé¢ããããã«ãäŸåæ§ã®æ³šå ¥ã䜿çšããŠã¢ããã¿ãŒãŸãã¯ã¬ã€ã€ãŒãã³ã¢ã«æäŸããŸããããã«ãããã³ã¢ã³ãŒãã倿Žããããšãªããã¢ããã¿ãŒãŸãã¯ã¬ã€ã€ãŒã®ç°ãªãå®è£ ãç°¡åã«äº€æã§ããŸãã
äŸïŒ
// TaskServiceãTaskListã³ã³ããŒãã³ãã«æ³šå
¥ãã
function TaskList(props: { taskService: TaskService }) {
const { taskService } = props;
const handleCreateTask = async (taskData: TaskData) => {
await taskService.createTask(taskData);
// ã¿ã¹ã¯ãªã¹ããæŽæ°
};
// ...
}
// äœ¿çšæ³
const apiTaskService = new ApiTaskService();
5. ãŠããããã¹ããäœæãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®äž»èŠãªå©ç¹ã®1ã€ã¯ããã¹ãæ§ã®åäžã§ããå€éšã®äŸåé¢ä¿ã«é Œãããšãªããã³ã¢ããžãã¹ããžãã¯ã®ãŠããããã¹ããç°¡åã«äœæã§ããŸããã¢ãã¯ã¢ããã¿ãŒãŸãã¯ã¬ã€ã€ãŒã䜿çšããŠå€éšã·ã¹ãã ã®åäœãã·ãã¥ã¬ãŒãããã³ã¢ããžãã¯ãæåŸ ã©ããã«æ©èœããŠããããšã確èªããŸãã
äŸïŒ
// ã¢ãã¯TaskService
class MockTaskService implements TaskService {
async createTask(taskData: TaskData): Promise {
return Promise.resolve({ id: '1', ...taskData });
}
async updateTask(taskId: string, taskData: TaskData): Promise {
return Promise.resolve({ id: taskId, ...taskData });
}
async getTask(taskId: string): Promise {
return Promise.resolve({ id: taskId, title: 'Test Task', description: 'Test Description' });
}
}
// ãŠããããã¹ã
describe('TaskList', () => {
it('should create a task', async () => {
const mockTaskService = new MockTaskService();
const taskList = new TaskList({ taskService: mockTaskService });
const taskData = { title: 'New Task', description: 'New Description' };
const newTask = await taskList.handleCreateTask(taskData);
expect(newTask.title).toBe('New Task');
expect(newTask.description).toBe('New Description');
});
});
å®è·µçãªèæ ®äºé ãšèª²é¡
ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯å€§ããªå©ç¹ãæäŸããŸãããããã³ããšã³ãéçºã«é©çšããéã«ã¯ãããã€ãã®å®è·µçãªèæ ®äºé ãšèª²é¡ãå¿ã«çããŠããå¿ èŠããããŸãïŒ
- è€éæ§ã®å¢å ïŒ ãããã®ã¢ãŒããã¯ãã£ã¯ãç¹ã«å°èŠæš¡ãŸãã¯åçŽãªã¢ããªã±ãŒã·ã§ã³ã®å Žåãã³ãŒãããŒã¹ã«è€éããå ããå¯èœæ§ããããŸãã
- åŠç¿æ²ç·ïŒ éçºè ã¯ããããã®ã¢ãŒããã¯ãã£ã广çã«å®è£ ããããã«ãæ°ããæŠå¿µããã¿ãŒã³ãåŠã¶å¿ èŠããããããããŸããã
- éå°èšèšïŒ ã¢ããªã±ãŒã·ã§ã³ã®éå°èšèšãé¿ããããšãéèŠã§ããåçŽãªã¢ãŒããã¯ãã£ããå§ããå¿ èŠã«å¿ããŠåŸã ã«è€éããå ããŠãã ããã
- æœè±¡åã®ãã©ã³ã¹ïŒ é©åãªã¬ãã«ã®æœè±¡åãèŠã€ããããšã¯é£ããå ŽåããããŸããæœè±¡åãå€ããããšã³ãŒããçè§£ãã«ãããªããå°ãªããããšå¯çµåã«ã€ãªããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé ïŒ éåºŠã®æœè±¡åã¬ã€ã€ãŒã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°ãè¡ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããšãéèŠã§ãã
åœéçãªäºäŸãšé©å¿
ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®ååã¯ãå°ççãªå Žæãæåçèæ¯ã«é¢ä¿ãªããããã³ããšã³ãéçºã«é©çšå¯èœã§ãããã ããå ·äœçãªå®è£ ãé©å¿ã¯ããããžã§ã¯ãã®èŠä»¶ãéçºããŒã ã®å¥œã¿ã«å¿ããŠç°ãªãå ŽåããããŸãã
äŸ1ïŒã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã
ã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ã§ã¯ããããµãŽãã«ã¢ãŒããã¯ãã£ã䜿çšããŠãã³ã¢ãšãªãã·ã§ããã³ã°ã«ãŒããšæ³šæç®¡çããžãã¯ãUIãã¬ãŒã ã¯ãŒã¯ã決æžã²ãŒããŠã§ã€ããåé¢ããããšãèããããŸããã³ã¢ã¯ãååã®ç®¡çãäŸ¡æ Œã®èšç®ã泚æã®åŠçãæ åœããŸãããã©ã€ãã³ã°ã¢ããã¿ãŒã«ã¯ãååã«ã¿ãã°ãã·ã§ããã³ã°ã«ãŒãããã§ãã¯ã¢ãŠãããŒãžã®Reactã³ã³ããŒãã³ããå«ãŸããŸããããªãã³ã¢ããã¿ãŒã«ã¯ãããŸããŸãªæ±ºæžã²ãŒããŠã§ã€ïŒäŸïŒStripeãPayPalãAlipayïŒãé 鿥è ïŒäŸïŒFedExãDHLãUPSïŒã®ããã®APIã¯ã©ã€ã¢ã³ããå«ãŸããŸããããã«ããããã©ãããã©ãŒã ã¯ããŸããŸãªå°åã®æ±ºæžæ¹æ³ãé éãªãã·ã§ã³ã«å®¹æã«é©å¿ã§ããŸãã
äŸ2ïŒå€èšèªå¯Ÿå¿ã®ãœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³
å€èšèªå¯Ÿå¿ã®ãœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¯ãªãŒã³ã¢ãŒããã¯ãã£ã䜿çšããŠãã³ã¢ãšãªããŠãŒã¶ãŒèªèšŒãšã³ã³ãã³ã管çããžãã¯ãUIãããŒã«ãªãŒãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ããåé¢ããããšãã§ããŸãããšã³ãã£ãã£ã¯ãŠãŒã¶ãŒãæçš¿ãã³ã¡ã³ãã衚ããŸãããŠãŒã¹ã±ãŒã¹ã¯ããŠãŒã¶ãŒãã³ã³ãã³ããäœæãå ±æãæäœããæ¹æ³ãå®çŸ©ããŸããã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒã¯ãã³ã³ãã³ãã®ããŸããŸãªèšèªãžã®ç¿»èš³ããç°ãªãUIã³ã³ããŒãã³ãçšã®ããŒã¿ãã©ãŒããããåŠçããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯æ°ããèšèªãç°¡åã«ãµããŒãããããŸããŸãªæåçå奜ã«é©å¿ã§ããŸãã
çµè«
ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯ãä¿å®æ§ããã¹ãæ§ãæ¡åŒµæ§ã®é«ãããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®è²ŽéãªååãæäŸããŸããã³ã¢ããžãã¹ããžãã¯ãå€éšã®äŸåé¢ä¿ããåãé¢ãããšã§ãæéã®çµéãšãšãã«ããé²åããããããæè»ã§é©å¿æ§ã®é«ãã³ãŒãããŒã¹ãäœæã§ããŸãããããã®ã¢ãŒããã¯ãã£ã¯åæã«ã¯ããçšåºŠã®è€éããå ãããããããŸããããä¿å®æ§ããã¹ãæ§ãæ¡åŒµæ§ãšããç¹ã§ã®é·æçãªå©ç¹ã¯ãè€éãªããã³ããšã³ããããžã§ã¯ãã«ãšã£ãŠäŸ¡å€ããæè³ãšãªããŸããåçŽãªã¢ãŒããã¯ãã£ããå§ããå¿ èŠã«å¿ããŠåŸã ã«è€éããå ããããšããããŠé¢é£ããå®è·µçãªèæ ®äºé ãšèª²é¡ãæ éã«æ€èšããããšãå¿ããªãã§ãã ããã
ãããã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãåãå ¥ããããšã§ãããã³ããšã³ãéçºè ã¯ãäžçäžã®ãŠãŒã¶ãŒã®é²åããããŒãºã«å¿ããããšãã§ãããããå ç¢ã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
åèæç®
- Hexagonal Architecture: https://alistaircockburn.com/hexagonal-architecture/
- Clean Architecture: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html